<?php
class Application_Model_Tiles extends Xend_Db_Model {
	protected $_dbTableName = 'Application_Model_Table_Tiles';

	public function __construct() {
		parent::__construct();
	}

	public function find($where, $ref = array()) {
		$tile = null;

		if(is_array($data = $this->findall($where, $ref, array('limit' => 1)))) {
			$tile = current($data);
		}

		return $tile;
	}

	/**
	 * fragt alle Daten der Kachel ab, die auf die uebergebenen Bedingungen zutreffen
	 * @param array $where Array mit Bedingungen, die an die Datenbank uebergeben werden
	 * @param array $ref Array mit Tabellen, die verknuepft werden sollen
	 * @return array Array mit den Daten, die aus der Datenbank geladen wurden 
	 */	
	public function findall($where = array(), $ref = array(), $options = array()) {
		$tiles	= array();
		$ref		= array_flip($ref);
		$select = $this->_database
			->select()
			->from(
				array('tiles'),
        array('tiles.id', 'tiles.x', 'tiles.y', 'tiles.tile_types_id')
			);
		
		// Referenzen
		// -----------------------------------------------------------------------------------		
		if(empty($ref) === false) {			
			if(array_key_exists('TileTypes', $ref)) {
				$select
					->joinLeft('tile_types', 'tiles.tile_types_id = tile_types.id', null)
					->columns(array('id', 'name'), 'tile_types');		
			}
		}		
		
		// Where
		// -----------------------------------------------------------------------------------			
		if(is_array($where) && !empty($where)) {
			foreach($where as $k => $v) {
				$select->where($k, $v);
			}
		}		
		
		// Options
		// -----------------------------------------------------------------------------------
		if(isset($options['limit'])) {
			$select->limit($options['limit'], 0);
		}		
		
		foreach($this->fetch($select) as $k => $v) {
			
			// TileTypes
			// ---------------------------------------------------------------------------------
			$type = new Application_Model_Schema_TileType();
			$type->setId($v['tiles']['tile_types_id']);
			
			if(empty($ref) === false) {			
				if(array_key_exists('TileTypes', $ref)) {
					$type
						->setName($v['tile_types']['name']);
				}
			}			

			// Tiles
			// ---------------------------------------------------------------------------------
			$tile = new Application_Model_Schema_Tile();				
			$tile
				->setId($v['tiles']['id'])
				->setX($v['tiles']['x'])
				->setY($v['tiles']['y'])
				->setType($type);
			
			$tiles[(int) $v['tiles']['id']] = $tile;
		}
		
		// Resourcen
		// -----------------------------------------------------------------------------------		
		if(array_key_exists('TileResources', $ref)) {
			$tiles = $this->_assignResourceReferences($tiles);
		}
		if(array_key_exists('TileObjects', $ref)) {
			$tiles = $this->_assignObjectReferences($tiles);
		}		

		return $tiles;
	}
	
	/**
	 * verknuepft die, per Array uebergebenen, Tiles mit den Daten der 
	 * referenzierten TileResourcen
	 * @param array $sources Array mit den Daten der Tiles
	 * @param array $references optionales Array mit den UID der Resourcen
	 * @return array Array der Tiles mit den verknuepften Tile-Resourcen
	 */
	protected function _assignResourceReferences($sources, $references = array()) {

		// falls nicht uebergeben, erstelle ein Reference-Array mit den UIDs der Resourcen
		// die geladen werden sollen
		if(empty($references)) {
			$references = array_keys($sources);
		}

		// lade referenzierte TileResourcen
		$tileResourceModel	= new Application_Model_TileResources();
		$tileResourceData		= $tileResourceModel->findall(array('tile_resources.tiles_id IN (?)' => $references), array('Resources'));
		
		// Resourcen dem Source (Tiles) zuordnen
		foreach($tileResourceData as $tileResource) {
			if(array_key_exists($tileResource->tile->id, $sources)) {
				$sources[$tileResource->tile->id]->setResource($tileResource->resource);
			}
		}		
		
		return $sources;
	}
	
	/**
	 * verknuepft die, per Array uebergebenen, Tiles mit den Daten der 
	 * referenzierten TileObjects
	 * @param array $sources Array mit den Daten der Tiles
	 * @param array $references optionales Array mit den UID der Objekte
	 * @return array Array der Tiles mit den verknuepften Objekten
	 */
	protected function _assignObjectReferences($sources, $references = array()) {

		// falls nicht uebergeben, erstelle ein Reference-Array mit den UIDs der Objekte
		// die geladen werden sollen
		if(empty($references)) {
			$references = array_keys($sources);
		}

		// lade referenzierte TileObjects
		$mTileObject	= new Application_Model_TileObjects();
		$dTileObject	= $mTileObject->findall(array('tile_objects.tiles_id IN (?)' => $references), array('Objects', 'ObjectTypes'));
		
		// Resourcen dem Source (Tiles) zuordnen
		foreach($dTileObject as $tileObject) {
			if(array_key_exists($tileObject->tile->id, $sources)) {
				$sources[$tileObject->tile->id]->setObject($tileObject->object);
			}
		}		
		
		return $sources;
	}	
}
?>